package com.tedu.api.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO流：   传输数据   C/S  聊天室 Version
 * API上部分：字符串、包装类、日期类、集合
 * ---------电脑有三大件：CPU     硬盘    内存
 * API下部分：IO流     ------硬盘-----文件数据传输
 *包位置：Java.io
 *  File文件、文件夹类
 *  作用：用于表示操作系统中系统的一个文件或者”目录：文件夹“
 *  创建File对象----->有参构造器----->“路径+文件文件夹全称“
 *
 * File类方法使用：
 * 1.查看文件或者”文件夹：目录“的属性信息（名字、大小、是否存在）
 * 2.操作文件或者”文件夹：目录“（创建、删除）
 * 3.访问一个”文件夹：目录“的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
        //创建文件夹类
        //需求：当前API下创建文件---手动--demo.txt   char r=‘\\’
       /* File file=
                new File("D:\\javaapi\\API\\src\\main" +
                        "\\java\\com\\tedu\\api\\io\\demo.txt");*/
        //相对路径---当前API下创建文件！ 项目：Maven结构   main编写代码
        //FileAPI.java    相对于   API   项目下  --->从src开始
        //从操作系统开始：路径    \   代表路径       文件上传至服务器   √
        //                     |   代表路径       文件下载到本地
        //Java任何平台【操作系统】运行    统一路径属性
        //File.separator 静态属性：任何操作系统下转换成正确的路径表示方法
        File file=new File("src"+File.separator+"main"+
               ""+ File.separator+"java"+
                ""+File.separator+"com"+
                ""+File.separator+"tedu"+
                ""+File.separator+"api" +
                ""+File.separator+"io"+File.separator+"demo.txt");
        //判断文件是否存在的方法
        boolean b=file.exists();
        System.out.println("判断文件是否存在："+b);
    }

    /**
     * 查看文件夹属性信息：
     * getName()    返回值：String
     * 作用：获取文件的名字【注意：不看路径是否对错】
     * length()      返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()      返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类---路径：Maven项目---相对路径
        //相对路径：  ./ 当前API项目下
   File file=new File("." +
           ""+File.separator+"demo.txt");
   //打印file的路径
        System.out.println("打印file的路径："+file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径是否存在："+file.exists());
        //获取文件名字
        String name=file.getName();
        System.out.println("文件或者文件夹的名字："+name);
        //获取文件的”大小：字节量“
        long len=file.length();
        System.out.println("获取文件大小：【字节量】"+len);//一个汉字等于3个字节量
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成API项目文件夹下   自动创建  test.txe  文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称    ./test.txt
        File file=new File("." +
                ""+File.separator+"test.txt");
        //判断---如果文件不存在---创建
        //       如果文件存在----不创建
        if (!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~");
        }else {
            System.out.println("文件存在，别创建了~");
        }

    }
    /**
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：使用代码API项目下的  test.txt   删除
     */
    @Test
    public void testDelete(){
        //创建File类    路径：./test.txt    ./不写代表 当前项目
        File file=new File("test.txt");
        //判断  如果文件  存在---->删除
        //              不存在---->删除
        if (file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除");
        }else{
            System.out.println("文件已经删除~~");

        }


    }
    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API   项目下   创建一个文件夹   demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void testMkdir(){
        //创建File文件/文件夹--->创建demo文件夹  /abc  /bcd
        File file=new File("demo" +
                ""+""+File.separator+"abc" +
                ""+File.separator+"bcd");
        //判断  如果文件不存在--创建文件夹
         //            存在--不创建
        if(!file.exists()){
            System.out.println("文件夹不存在~");
            file.mkdirs();
            System.out.println("创建文件夹~");

        }else{
            System.out.println("别创建了");
        }
    }
    //作业1：删除多层文件夹  demo/abc/bcd,【泵使用递归】
    //提示：构造器  new File(File parent,"子路径");
    //   不需要exists判断
    //思路：找到每一级路径【bcd删除完毕--abc删除完毕--demo】
@Test
public void testHomeWork1() {
    //1.创建多层文件夹demo/abc/bcd


    File parent = new File("demo");
    //构造器使用（父级路径，子集路径）  ；父级路径/子集路径
    File child1 = new File(parent, "abc");
    File child2 = new File(child1, "bcd");
    child2.delete();  //删除bcd
    child1.delete();  //删除abc
    parent.delete();  //删除demo
}
//  ②  File file=new File("demo" +
//            ""+File.separator+"abc" +
//            ""+File.separator+"bcd");
//    //2.测试删除
//    file.delete();
    //作业2：提示--创建FileFilter接口---匿名内部类
    /*FileFilter  ff=new FileFilter(){
    public boolean accept(File pathname){
    return false;
    }  */
 /*   parent.listFiles(new FileFilter() {
        public boolean accept(File pathname) {
            return false;
        }
*/

        /**
         * 访问文件夹--->所有子项【文件夹和文件】
         * listFiles()      返回值：file[]   文件数组
         * 作用：获取文件夹的所有子项【包含文件夹和文件】
         * isFile()    返回值：Boolean
         * 作用：判断是否为文件夹，是文件夹true，反之
         * isDirectory   返回值：Boolean
         * 作用：判断是否为文件夹，是文件夹true，反之
         * 需求： 获取API   项目下  所有的文件夹文字
         */
        @Test
        public void testListFiles() {
            //获取 API 项目
            File file = new File("." + File.separator);
            // System.out.println(file.getAbsoluteFile());
            //过滤：3个文件还有4个文件夹，过滤是文件夹
            if (file.isDirectory()) {  //----过滤没有效果---
                //获取到所有的文件夹
                File[] dir = file.listFiles();
                //遍历所有的文件夹名字
                for (int i = 0; i < dir.length; i++) { // i  拿到所有下标
                    //打印文件夹名字
                    System.out.println(dir[i].getName());
                }
            }
        }
    }